﻿using System;
using System.Collections.Generic;
using System.Data;
using accesoDatos;
using clasesBase;

namespace Logica
{
    public class PlanillaProduccion : EntidadAlmacenable
    {
        /* --------------------- Atributos de la clase. Recordar que hay atributos heredados --------------------- */
        private String responsable = "";
        private DateTime fecha = ValoresGlobales.FechaMinima;
        private int numeroLote = 0, idItemPlanificacionProduccion = 0, cantEstuchesObtenidos = 0;

        private List<ItemPlanilla> items;
        private List<CaractLoteProductoPlanilla> caracteristicas;
        private List<InstruccionPlanilla> instrucciones;

        public const string tablaBD = "planillaproduccion", columnaID = "id";


        /* --------------------- Propiedades --------------------- */
        public int ID
        {
            get { return this.id; }
            set { this.id = value; }
        }

        public int CantEstuchesObtenidos
        {
            get { return this.cantEstuchesObtenidos; }
            set { this.cantEstuchesObtenidos = value; }
        }

        public int IdItemPlanificacionProduccion
        {
            get { return this.idItemPlanificacionProduccion; }
            set { this.idItemPlanificacionProduccion = value; }
        }

        public String Responsable
        {
            get { return responsable; }
            set { responsable = value; }
        }

        public DateTime Fecha
        {
            get { return fecha; }
            set { fecha = value; }
        }

        public int NumeroLote
        {
            get { return this.numeroLote; }
            set { this.numeroLote = value; }
        }

        public List<ItemPlanilla> Items
        {
            get { return this.items; }
            set { this.items = value; }
        }

        public List<InstruccionPlanilla> Instrucciones
        {
            get { return this.instrucciones; }
            set { this.instrucciones = value; }
        }

        public List<CaractLoteProductoPlanilla> Caracteristicas
        {
            get { return this.caracteristicas; }
            set { this.caracteristicas = value; }
        }


        /* --------------------- Constructores --------------------- */
        public PlanillaProduccion()
            : this(0, true) // Llamo al constructor que recibe un parámetro para reutilizar el código del mismo
        { }

        public PlanillaProduccion(int idElem)
            : this(idElem, true) // Llamo al constructor que recibe un parámetro para reutilizar el código del mismo
        { }

        /* IMPORTANTE:
             ** Si el campo identificador unívoco de la tabla actual tuviese un nombre distinto de "id", se lo debe setear en este momento
             * (atributo heredado: nombreColumnaID)
             ** Si el campo identificador unívoco NO se generase automáticamente, se lo debe definir en este momento, cambiando el atributo
             * heredado idAutoGenerado por FALSE.
             */
        public PlanillaProduccion(int idElem, bool cargarListas)
            : base() // Llamo al constructor padre en primer lugar, para inicializar los valores correspondientes
        {
            // Es importante esta asignación ya que estos valores se utilizan tanto en métodos del objeto padre como éste
            this.nombreTablaBD = tablaBD;
            this.nombreColumnaID = columnaID;
            this.id = idElem;

            this.relacionesOtrasTablas.Add(ItemPlanilla.tablaBD, "idPlanilla");
            this.relacionesOtrasTablas.Add(CaractLoteProductoPlanilla.tablaBD, "idPlanilla");

            // Si se hubiese enviado un id != 0, entonces se buscan los datos del elemento en la BD para cargarlos al objeto actual que se está creando
            if (this.id != 0)
            {
                DataRow elemento = this.buscarElemento(id);
                try
                {
                    this.responsable = elemento["responsable"].ToString().Trim();
                    this.fecha = Convert.ToDateTime(elemento["fecha"]);
                    this.numeroLote = Convert.ToInt32(elemento["numeroLote"]);
                    this.idItemPlanificacionProduccion = Convert.ToInt32(elemento["idItemPlanificacion"]);
                    this.cantEstuchesObtenidos = Convert.ToInt32(elemento["cantEstuchesObtenidos"]);
                }
                catch (Exception ex)
                {
                    this.error = ex.Message;
                }
            }

            if (cargarListas) cargarColecciones();
            else
            {
                this.items = new List<ItemPlanilla>();
                this.caracteristicas = new List<CaractLoteProductoPlanilla>();
                this.instrucciones = new List<InstruccionPlanilla>();
            }
        }

        public void cargarColecciones()
        {
            this.items = ItemPlanilla.listar(new string[] { "idPlanilla" }, new string[] { "E" + this.id.ToString() });
            this.caracteristicas = CaractLoteProductoPlanilla.listar(new string[] { "idPlanilla" }, new string[] { "E" + this.id.ToString() });
            this.instrucciones = InstruccionPlanilla.listar(new string[] { "idPlanilla" }, new string[] { "E" + this.id.ToString() });
        }


        /* --------------------- Métodos --------------------- */
        public static List<PlanillaProduccion> listar(String[] columnasFiltros, String[] valoresFiltros)
        {
            List<PlanillaProduccion> listado = new List<PlanillaProduccion>();
            DataTable tabla = EntidadAlmacenable.listarElementos(tablaBD, columnasFiltros, valoresFiltros);
            try
            {
                foreach (DataRow fila in tabla.Rows)
                {
                    PlanillaProduccion elemento = new PlanillaProduccion(Convert.ToInt32(fila[columnaID]), true);
                    listado.Add(elemento);
                }
            }
            catch (Exception ex)
            {
            }

            return listado;
        }

        public String guardar()
        {
            String[] columnas = new String[] { columnaID, "responsable", "fecha", "numeroLote", "idItemPlanificacion", "cantEstuchesObtenidos" };
            String[] valores = new String[] { this.id.ToString(), this.responsable.Trim().ToUpper(), Validador.formatearFecha(this.fecha), this.numeroLote.ToString(), this.idItemPlanificacionProduccion.ToString(), this.cantEstuchesObtenidos.ToString() };

            string error = "";
            error = base.guardarElemento(columnas, valores);
            if (error.Equals("")) // Si se guardó correctamente la planilla, continúo y guardo los items y características
            {
                string errorItem = "";
                foreach (ItemPlanilla item in this.items)
                {
                    item.IdPlanilla = this.id;
                    errorItem = " " + item.guardar();
                }
                if (!errorItem.Trim().Equals("")) error += "Errores ocurridos al insertar los ítems: " + errorItem;

                string errorCaract = "";
                foreach (CaractLoteProductoPlanilla caract in this.caracteristicas)
                {
                    caract.IdPlanilla = this.id;
                    errorCaract += " " + caract.guardar();
                }
                if (!errorCaract.Trim().Equals("")) error += "Errores ocurridos al insertar las características: " + errorCaract;

                string errorInstruccion = "";
                foreach (InstruccionPlanilla instr in this.instrucciones)
                {
                    instr.IdPlanilla = this.id;
                    errorInstruccion += " " + instr.guardar();
                }
                if (!errorInstruccion.Trim().Equals("")) error += "Errores ocurridos al insertar las características: " + errorInstruccion;
            }

            return error;
        }
    }
}